<?php
/**
 * 描述 : 对XML HTML解析提取方法
 */

class core_xtmDec {

    private static $DOMDocument = null;

    public static function DOMDocument() {
        if (empty(self::$DOMDocument)) {
            self::$DOMDocument = new DOMDocument();
        }
        return self::$DOMDocument;
    }

    /**
     * 描述 : 从一个字符串加载HTML
     * 作者 : zzg
     */
    public static function normalizeHtml($html) {
        //获取方法对象
        $dom = self::DOMDocument();
        //解决中文乱码问题
        $html = mb_convert_encoding($html ,'HTML-ENTITIES',"UTF-8");
        //从一个字符串加载HTML
        @$dom->loadHTML($html);

        //使该HTML规范化
        $dom->normalize();
        return $dom;
    }

    /**
     * 描述 : xPath解析
     * 参数 : html : 源代码,
     *       xPaths : {
     *            获取字段 : {
     *                "attr" : 指定获取属性,
     *                "xPath" : 获取语法,
     *                "note" : 是否返回对象再次处理, 默认false不需要返回,
     *            }
     *       }
     * 返回 : {
     *            获取字段 : [{
     *                "content" : 获取你内容,
     *                "note" : 对象,
     *            },..]
     *        }
     * 作者 : zzg
     */
    public static function xPath($html, $xPaths) {
        $result = array();

        $html = self::normalizeHtml($html);

        //用DOMXpath加载DOM，用于查询
        $DOMEPath = new DOMXPath($html);

        foreach ($xPaths as $name => $xPathValue) {
            //解析目标参数
            $nameResult = array();
            $xPath = $xPathValue['xPath'];
            $attr = !empty($xPathValue['attr']) ? $xPathValue['attr'] : null;
            $note = empty($xPathValue['note']) ? false : true;

            $items = $DOMEPath->query($xPath);

            for ($i = 0; $i < $items->length; $i++) {
                $item = $items->item($i);
                $nodeName = $item->nodeName;
                // 1.Element 2.Attribute 3.Text
                $nodeType = $item->nodeType;
                //图片取路径

                if ($attr !== null) {
                    $content = $item->getAttribute($attr);
                } else if ($nodeType == 1 && $nodeName == 'img') {
                    $content = $item->getAttribute('src');
                } else {
                    $content = $item->nodeValue;
                }
                $itemResult = array(
                    'content' => $content,
                );
                //可以再次取值
                $note === true && $itemResult['note'] = $item;
                $nameResult[] = $itemResult;
            }
            $result[$name] = $nameResult;

        }
        //转数组
        return $result;
    }
}